package TCPMain.server;

import java.util.concurrent.TimeUnit;

public class ConsoleProgressBar {
    private long totalSteps; // 总进度步数
    private long currentStep;// 当前进度步数
    private long progressBarWidth; // 进度条显示宽度
    private char progressChar; // 进度条已完成部分的字符
    private char emptyChar; // 进度条未完成部分的字符

    public ConsoleProgressBar(long totalSteps, long progressBarWidth, char progressChar, char emptyChar) {
        this.totalSteps = totalSteps;
        this.progressBarWidth = progressBarWidth;
        this.progressChar = progressChar;
        this.emptyChar = emptyChar;
    }

    /**
     * 更新并显示进度条
     * @param currentStep 当前进度步数
     */
    public void updateProgress(long currentStep) {
        // 更新当前进度步数
        this.currentStep+=currentStep;
        // 计算已完成的百分比
        long percentage = (long) ((this.currentStep * 100.0) / totalSteps);

        // 计算已完成的进度条长度
        long progressWidth = (long) ((this.currentStep * progressBarWidth) / totalSteps);

        // 构建进度条字符串
        StringBuilder progressBar = new StringBuilder();
        progressBar.append("[");
        for (long i = 0; i < progressBarWidth; i++) {
            if (i < progressWidth) {
                progressBar.append(progressChar); // 已完成部分
            } else {
                progressBar.append(emptyChar); // 未完成部分
            }
        }
        progressBar.append("] ");
        progressBar.append(String.format("%3d", percentage)); // 格式化百分比，保留3位宽度
        progressBar.append("%");

        // 输出进度条
        System.out.print("\r" + progressBar.toString()); // 使用`\r`回到行首
    }

    /**
     * 完成进度条显示
     */
    public void finish() {
        PrintUnitl.println("\n任务完成！");
    }

    /**
     * 模拟进度条更新的示例方法
     */
    public static void main(String[] args) {
        ConsoleProgressBar progressBar = new ConsoleProgressBar(200, 50, '#', '-');

        for (int i = 0; i <= progressBar.totalSteps; i++) {
            progressBar.updateProgress(100); // 更新进度条
            try {
                TimeUnit.MILLISECONDS.sleep(100); // 模拟任务耗时
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        progressBar.finish(); // 完成进度条显示
    }
}